package com.graden.background.common.utils.aes;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;

/**
 * JDK 1.6 以上 AES 是一种可逆加密算法，对用户的敏感信息加密处理 对原始数据进行AES加密后，再进行Base64编码转化；
 */
public class AESOperator {
	/*
	 * 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式，key需要为16位。
	 */
	private static final String sKey = "abcdef0123456789";
	private static final String ivParameter = "9iuj87y2hbi5wxlk";

	private static final String CIPHER = "AES/CBC/PKCS5Padding";
	private static final String AES = "AES";
	private static final String CHARSET = "UTF-8";


	// 加密
	public static String encrypt(String sSrc) throws Exception {
		Cipher cipher = Cipher.getInstance(CIPHER);
		byte[] raw = sKey.getBytes();
		SecretKeySpec skeySpec = new SecretKeySpec(raw, AES);
		IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式，需要一个向量iv，可增加加密算法的强度
		cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
		byte[] encrypted = cipher.doFinal(sSrc.getBytes(CHARSET));

		return DatatypeConverter.printBase64Binary(encrypted);
	}


	// 解密
	public static String decrypt(String sSrc) throws Exception {
		byte[] raw = sKey.getBytes("ASCII");
		SecretKeySpec skeySpec = new SecretKeySpec(raw, AES);
		Cipher cipher = Cipher.getInstance(CIPHER);
		IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
		cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
		// byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//
		// 先用base64解密
		byte[] encrypted1 = DatatypeConverter.parseBase64Binary(sSrc);
		;// 先用base64解密
		byte[] original = cipher.doFinal(encrypted1);
		return new String(original, CHARSET);
	}



}
